﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Entity;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface IBienRepository
    {
        List<BIEN> GetAllFromBien();
        List<BIEN> GetFromBienByNombre(string nombre);
        BIEN GetOneBienByNombre(string nombre);
        BIEN GetFromBienById(Int32 id);
        void AddBien(BIEN bien);
        void UpdateBien(BIEN bien);
        void RemoveBien(Int32 id);
        bool ExisteDuplicidadBienNombre(string codigo, string nombre, Int32 ID);
    }

    public class BienRepository : MasterDataAccess, IBienRepository
    {
        public List<BIEN> GetAllFromBien()
        {
            var query = from p in Context.BIENs.Include("MARCA").Include("CATEGORIA")
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<BIEN> GetFromBienByNombre(string nombre)
        {
            var query = from c in Context.BIENs.Include("MARCA").Include("CATEGORIA")
                        select c;

            if (!string.IsNullOrEmpty(nombre))
            {
                query = from c in query
                        where c.Nombre.ToUpper().Contains(nombre.ToUpper())
                        select c;
            }

            return query.ToList();
        }

        public BIEN GetOneBienByNombre(string nombre)
        {
            return Context.BIENs.Where(c => c.Nombre.Equals(nombre)).FirstOrDefault();
        }

        public BIEN GetFromBienById(int id)
        {
            var query = from p in Context.BIENs
                        where p.ID.Equals(id)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public void AddBien(BIEN bien)
        {
            bien.CATEGORIA = null;
            bien.MARCA = null;
            
            if (bien.ID.Equals(0))
            {
                Context.BIENs.Add(bien);
            }

            Context.SaveChanges();
        }

        public void UpdateBien(BIEN bien)
        {
            var bienDB = Context.BIENs.Find(bien.ID);
            
            bienDB.Cantidad = bien.Cantidad;
            bienDB.Caracteristicas = bien.Caracteristicas;
            bienDB.IdCategoria = bien.IdCategoria;
            bienDB.Codigo = bien.Codigo;
            bienDB.IdMarca = bien.IdMarca;
            bienDB.Nombre = bien.Nombre;
            bienDB.Serie = bien. Serie;

            bienDB.CATEGORIA = bien.CATEGORIA;
            bienDB.MARCA = bien.MARCA;

            Context.Entry(bien).State = EntityState.Modified;

            Context.SaveChanges();
        }

        public void RemoveBien(int id)
        {
            var existe = Context.BIENs.Find(id);
            Context.BIENs.Remove(existe);
            Context.SaveChanges();
        }

        public bool ExisteDuplicidadBienNombre(string codigo, string nombre, Int32 ID)
        {
            var query = from c in Context.BIENs
                        where (c.Codigo.ToUpper().CompareTo(codigo.ToUpper()) == 0 ||
                        c.Nombre.ToUpper().CompareTo(nombre.ToUpper()) == 0)
                        && c.ID != ID

                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.Any();
        }
    }
}
